//定义：保证一个类仅有一个实例 并提供一个访问它的全局访问点
//核心：确保只有一个实例，并提供全局访问 对象池变种
var Single = (function(){
    var instance;
    function init() {
        // 定义私有方法和属性
        // 操作逻辑
        console.log("单例模式",instance)
        return {
           // 定义公共方法和属性
           
        };
    }
    return {
        // 获取实例
        getInstance:function(){
            if(!instance){
                instance = init();
            }
            return instance;
        }
    }
})();

var obj1 = Single.getInstance();
var obj2 = Single.getInstance();
console.log(obj1 === obj2);

//实现 假设要设置一个管理员 多次调用也仅设置一次 我们可以 使用闭包缓存一个内部变量来实现这个单例
function SetManager(name) {
    this.manager = name;
}

SetManager.prototype.getName = function() {
    console.log(this.manager);
};

var SingletonSetManager = (function() {
    var manager = null;
    return function(name) {
        if (!manager) {
            manager = new SetManager(name);
        }

        return manager;
    } 
})();

SingletonSetManager('a').getName(); // a
SingletonSetManager('b').getName(); // a
SingletonSetManager('c').getName(); // a

//提出通用的单例
function getSingleton(fn){
    var instance = null;
    return function(){
        
        if(!instance){
            instance = fn.apply(this,arguments);
        }
        // console.log(instance,'实例')
        return instance;
    }
}
//管理员
var managerSingleton = getSingleton(function(name){
    var manager = new SetManager(name)
    return manager
})
managerSingleton('aa').getName();//aa
managerSingleton('bb').getName();//aa
//添加 hr
function SetHr(name){
    this.hr = name;
}
SetHr.prototype.getName= function(){
    console.log(this.hr)
}
var hrSingleton = getSingleton(function(name){
    var hr = new SetHr(name)
    return hr;
})
hrSingleton('HR').getName();//HR
hrSingleton("ceo").getName();//HR


function test(html){
    let div={}
    div.html = html;
    console.log(div);//{ html: 'hhhhh' }
    return div;
}
var testSingleton = getSingleton(function(){

    let div = test.apply(this,arguments);
    return div
})
console.log(
    testSingleton('hhhhh'),
    testSingleton('ddddd')
    
)
